#include<string.h> #include<algorithm> #include<iostream> using namespace std; const int N=300001,inf=(int)1e9; int K,num[N]; struct BIT{ #define lowbit(x) (x&(-x)) int bit[N]; BIT(){ memset(bit,0,sizeof(bit)); } void add(int x){ for(;x<N;x+=lowbit(x))bit[x]++; } int sum(int x){ int res=0; for(;x;x-=lowbit(x))res+=bit[x]; return res; } int query(int L,int R){ return sum(R)-sum(L-1); } }T; struct node{ int L,R,mx,id,add; }tree[N<<2]; struct Segment_Tree{ void up(int p){ if(tree[p<<1].mx>tree[p<<1|1].mx)tree[p].mx=tree[p<<1].mx,tree[p].id=tree[p<<1].id; else tree[p].mx=tree[p<<1|1].mx,tree[p].id=tree[p<<1|1].id; } void down(int p){ if(tree[p].add){ tree[p<<1].mx+=tree[p].add; tree[p<<1|1].mx+=tree[p].add; tree[p<<1].add+=tree[p].add; tree[p<<1|1].add+=tree[p].add; tree[p].add=0; } } void build(int L,int R,int p){ tree[p].L=L,tree[p].R=R,tree[p].add=0; if(L==R){ tree[p].mx=num[L-1],tree[p].id=L-1; return; } int mid=L+R>>1; build(L,mid,p<<1); build(mid+1,R,p<<1|1); up(p); } void update(int L,int R,int p){ if(tree[p].L==L&&tree[p].R==R){ tree[p].mx++; tree[p].add++; return; } down(p); int mid=tree[p].L+tree[p].R>>1; if(R<=mid)update(L,R,p<<1); else if(L>mid)update(L,R,p<<1|1); else update(L,mid,p<<1),update(mid+1,R,p<<1|1); up(p); } void remove(int x,int p){ if(tree[p].L==tree[p].R){ tree[p].mx=-inf; return; } down(p); int mid=tree[p].L+tree[p].R>>1; if(x<=mid)remove(x,p<<1); else remove(x,p<<1|1); up(p); } node query(int L,int R,int p){ if(tree[p].L==L&&tree[p].R==R)return tree[p]; down(p); int mid=tree[p].L+tree[p].R>>1; if(R<=mid)return query(L,R,p<<1); else if(L>mid)return query(L,R,p<<1|1); else{ node Lson=query(L,mid,p<<1),Rson=query(mid+1,R,p<<1|1); if(Lson.mx>Rson.mx)return Lson; return Rson; } } }ST; void inicjuj(int n, int k, int *D){ K=k; for(int i=0;i<n;i++){ num[i]=D[i]; if(num[i]>=K){ num[i]=-inf; T.add(i+1); } } ST.build(1,n,1); } void podlej(int a, int b){ ST.update(a+1,b+1,1); while(true){ node cur=ST.query(a+1,b+1,1); if(cur.mx>=K){ ST.remove(cur.id+1,1); T.add(cur.id+1); }else break; } } int dojrzale(int a, int b){ return T.query(a+1,b+1); }
|